@CLASS
labourJSONTests

@USE
pf/tests/pfTestCase.p

@BASE
pfTestCase

@OPTIONS
locals

@create[aTestName]
  ^BASE:create[$aTestName]

@setUp[]
  ^use[labour/converters/labourJSON.p]

@encodeStringTest[]
  $sResult[^labourJSON:encode[]]
  ^pfAssert:isTrue(^sResult.match[^^null^$])[Пустая строка неправильно сконвертировалась.]

  $sString[test]
  $sResult[^labourJSON:encode[$sString]]
  ^pfAssert:isTrue(^sResult.match[^^\"${sString}\"^$])[Строка $sString неправильно сконвертировалась.]

@encodeIntTest[]
  $iNumber(10)
  ^_encodeNumberTest($iNumber)[Положительное число $iNumber не сконвертировалось.]

  $iNumber(-10)
  ^_encodeNumberTest($iNumber)[Отрицательное число $iNumber не сконвертировалось.]

@encodeDoubleTest[]
  $dNumber(15.03)
  ^_encodeNumberTest($dNumber)[Положительное число $dNumber с плавающей точкой не сконвертировалось.]

  $dNumber(-15.03)
  ^_encodeNumberTest($dNumber)[Положительное число $dNumber с плавающей точкой не сконвертировалось.]

@_encodeNumberTest[altNumber;strText]
  $sResult[^labourJSON:encode($altNumber)]
  ^pfAssert:isTrue(^sResult.match[^^${altNumber}^$])[$strText]

@encodeBoolTest[]
  $bData(true)
  $sResult[^labourJSON:encode[$bData]]
  ^pfAssert:isTrue(^sResult.match[^^true^$])[Булевое выражение True не сконвертировалось.]

  $bData(false)
  $sResult[^labourJSON:encode[$bData]]
  ^pfAssert:isTrue(^sResult.match[^^false^$])[Булевое выражение False не сконвертировалось.]

@encodeDateTest[]
  $dNow[^date::now[]]
  $sResult[^labourJSON:encode[$dNow]]
  ^pfAssert:isTrue(^sResult.match[^^new\sDate\(^dNow.unix-timestamp[]000\)^$])[False]

@encodeXDocTest[]
  $xDoc[^xdoc::create{<?xml version="1.0" encoding="windows-1251" ?>
      <root>
        <data>Test Data</data>
      </root>
  }]
  $sDocTainted["^taint[js][^xDoc.string[]]"]
  $sResult[^labourJSON:encode[$xDoc]]
  ^pfAssert:isTrue($sDocTainted eq $sResult)[XML документ не сконвертировался.]

@encodeTableTest[]
  $tData[^table::create{Position	Who}]
  ^tData.append{1	me}
  ^tData.append{2	friend}

  $sResult[^labourJSON:encode[$tData]]

#TODO сделать проверку на валидность возвращаемого JSON
  $tMatches[^sResult.match["Position":\s?"(\d+)"(?:[\s]+)?,(?:[\s]+)?"Who":\s?"(\w+)][g]]

  ^pfAssert:isTrue($tMatches)[Нет совпадений в полученном JSON.]

  ^tMatches.offset(0)
  ^pfAssert:isTrue($tMatches.1 eq "1")[Position не соответствует у первой строки.]
  ^pfAssert:isTrue($tMatches.2 eq "me")[Who не соответствует у первой строки.]

  ^tMatches.offset(1)
  ^pfAssert:isTrue($tMatches.1 eq "2")[Position не соответствует у второй строки.]
  ^pfAssert:isTrue($tMatches.2 eq "friend")[Who не соответствует у второй строки.]

@encodeHashTest[]
#TODO тест на проверку конвертирования хэшей в JSON
  ^pfAssert:fail[Не реализовано.]

@encodeCollectionTest[]
#TODO тест на проверку конвертирования коллекций в JSON
  ^pfAssert:fail[Не реализовано.]

@encodeObjectTest[]
#TODO тест на проверку конвертирования пользовательских объектов в JSON
  ^pfAssert:fail[Не реализовано.]

@decodeStringTest[]
  $sJSON["test"]
  $sResult[^labourJSON:decode[$sJSON]]
  ^pfAssert:isTrue($sResult is string)[Полученный объект не соотвествует классу string.]
  ^pfAssert:isTrue($sResult eq "test")[Результат не соответствует: test.]

  $sJSON[null]
  $sResult[^labourJSON:decode[$sJSON]]
  ^pfAssert:isTrue($sResult is string)[Полученный объект не соотвествует классу string.]
  ^pfAssert:isTrue(!def $sResult)[Результат не соответствует пустой строке.]

@decodeNumberTest[]
  $sJSON[154]
  $iResult(^labourJSON:decode[$sJSON])
  ^pfAssert:isTrue(^labourJSON:decode[$sJSON] is int || ^labourJSON:decode[$sJSON] is double)[Полученный объект не соотвествует классу int/double.]
  ^pfAssert:isTrue($iResult == 154)[Результат не соответствует: 154.]

  $sJSON[-154]
  $iResult(^labourJSON:decode[$sJSON])
  ^pfAssert:isTrue(^labourJSON:decode[$sJSON] is int || ^labourJSON:decode[$sJSON] is double)[Полученный объект не соотвествует классу int/double.]
  ^pfAssert:isTrue($iResult == -154)[Результат не соответствует: -154.]

@decodeBooleanTest[]
  $sJSON[true]
  $bResult[^labourJSON:decode[$sJSON]]
  ^pfAssert:isTrue($bResult is bool)[Полученный объект не соотвествует классу bool.]
  ^pfAssert:isTrue($bResult)[Результат не соответствует: true.]

  $sJSON[false]
  $bResult[^labourJSON:decode[$sJSON]]
  ^pfAssert:isTrue($bResult is bool)[Полученный объект не соотвествует классу bool.]
  ^pfAssert:isTrue($bResult)[Результат не соответствует: false.]

@decodeObjectTest[]
  $sJSON[^{ 
    "string": "string",
    "int": 10,
    "double": 10.50,
    "bool": true
  ^}]
  $hResult[^labourJSON:decode[$sJSON]]
  ^pfAssert:isTrue($hResult is hash)[Полученный объект не соотвествует классу hash.]
  ^pfAssert:isTrue($hResult.string eq "string")[STRING]
  ^pfAssert:isTrue($hResult.int == 10)[INT]
  ^pfAssert:isTrue($hResult.double == 10.50)[Double]
  ^pfAssert:isTrue($hResult.bool)[TRUE]

@decodeArrayTest[]
  $sJSON[^[
    ^{
      "string": "string",
      "int": 5,
      "double": 13.2,
      "bool": false
    ^},
    ^{
      "string": null,
      "int": -1,
      "double": -1.05
    ^}
  ^]]
  $hResult[^labourJSON:decode[$sJSON]]
  ^pfAssert:isTrue($hResult is hash)[Полученный объект не соотвествует классу hash.]
  ^pfAssert:isTrue(^hResult._count[] == 2)[Не верное количество ключей полученного объекта.]

  ^pfAssert:isTrue($hResult.0 is hash)[Первый объект не соответствует классу hash.]
  ^pfAssert:isTrue($hResult.[0].string is string && $hResult.[0].string eq "string")[[object1] поле string не соответствует "string".]
  ^pfAssert:isTrue($hResult.[0].int == 5)[[object1] поле int не соответствует положительному числу: 5.]
  ^pfAssert:isTrue($hResult.[0].double == 13.2)[[object1] поле double не соответствует числу с плавающей точкой: 13.2.]
  ^pfAssert:isTrue($hResult.[0].bool is bool && !($hResult.[0].bool))[[object1] поле bool не соответствует булевому выражению: false.]

  ^pfAssert:isTrue($hResult.1 is hash)[Второй объект не соответствует классу hash.]
  ^pfAssert:isTrue(!def $hResult.[1].string)[[object1] поле string не соответствует пустой строке.]
  ^pfAssert:isTrue($hResult.[1].int == -1)[[object1] поле int не соответствует отрицательному числу: -1.]
  ^pfAssert:isTrue($hResult.[1].double == -1.05)[[object1] поле double не соответствует отрицательному числу с плавающей точкой: -1.05.]
